# 给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线，垂直线 i 的两个端点分别为 (i, 
# ai) 和 (i, 0) 。找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。 
# 
#  说明：你不能倾斜容器。 
# 
#  
# 
#  示例 1： 
# 
#  
# 
#  
# 输入：[1,8,6,2,5,4,8,3,7]
# 输出：49 
# 解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。 
# 
#  示例 2： 
# 
#  
# 输入：height = [1,1]
# 输出：1
#  
# 
#  示例 3： 
# 
#  
# 输入：height = [4,3,2,1,4]
# 输出：16
#  
# 
#  示例 4： 
# 
#  
# 输入：height = [1,2,1]
# 输出：2
#  
# 
#  
# 
#  提示： 
# 
#  
#  n == height.length 
#  2 <= n <= 105 
#  0 <= height[i] <= 104 
#  
#  Related Topics 贪心 数组 双指针 
#  👍 2786 👎 0


from typing import List


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def maxArea(self, height: List[int]) -> int:
        ans = 0
        l, r = 0, len(height) - 1
        while l < r:
            area = (r - l) * min(height[l], height[r])
            ans = max(ans, area)
            if height[l] <= height[r]:
                l += 1
            else:
                r -= 1
        return ans


# leetcode submit region end(Prohibit modification and deletion)


def log(*args, **kwargs):
    print(*args, **kwargs)


# 双指针
# 指针指在数组开始和结束
# 移动较小的指针, 左指针右移, 右指针左移, 计算水量
#     def maxArea(self, height: List[int]) -> int:
#         ans = 0
#         l, r = 0, len(height) - 1
#         while l < r:
#             area = (r - l) * min(height[l], height[r])
#             ans = max(ans, area)
#             if height[l] <= height[r]:
#                 l += 1
#             else:
#                 r -= 1
#         return ans

if __name__ == '__main__':
    s = Solution()
    h1 = [1, 8, 6, 2, 5, 4, 8, 3, 7]
    r1 = s.maxArea(h1)
    assert r1 == 49, r1
    pass
